<?php
/**
 * 抽象的数据库访问适配器接口
 * 
 * 定义每个适配器
 * 
 * @author Leo Ning <leo.ning@like18.com>
 * @abstract 
 * @version 1.0
 * @since 1.0
 * @copyright 2008-2011 LIKE18 INC.
 * @package model
 */
abstract class DataSource {
	protected $options = array ();
	protected $charset = 'UTF8';
	protected $connection = NULL;
	protected $dsm;
	protected $queryString = ''; // 最后一次SQL语句
	private $error_message;
	/**
	 * 构造函数,只负责为子类接收参数
	 * 
	 * @param array $options
	 *        	数据源参数(选项)
	 */
	public function __construct($options = array()) {
		$this->options = $options;
	}
	public function setDsm($dsm) {
		$this->dsm = $dsm;
	}
	public function getDsm() {
		return $this->dsm;
	}
	public function __set($p, $v) {
		if ($p == 'error_msg') {			
			$this->error_message = $v;
			elog ( $v );
		}
	}
	public function __get($p) {
		if ($p == 'error_msg') {
			return $this->error_message;
		}
		if (isset ( $this->{$p} )) {
			return $this->{$p};
		}
		return null;
	}
	/**
	 * 连接数据库
	 * 
	 * @return boolean 成功返回true,失败返回false
	 */
	public abstract function connect();
	
	/**
	 * 表全名,即添加前缀的后的名称
	 * 
	 * @param string $tablename
	 *        	表名称
	 */
	public abstract function fullname($table);
	/**
	 * 选择数据库
	 * 
	 * @param string $db
	 *        	要选择的数据库
	 * @return boolean 成功true,失败false
	 */
	public abstract function uses($db);
	/**
	 * 查询操作
	 * 
	 * @param string $sql
	 *        	要查询的语句
	 * @return ResultSet 查询结果集,失败返回false
	 */
	public abstract function query($sql);
	/**
	 * 分页查询
	 * 
	 * @param string $sql
	 *        	语句
	 * @param int $start
	 *        	分页
	 * @param int $limit
	 *        	分页大小
	 * @return ResultSet 查询结果集
	 */
	public abstract function queryLimit($sql, $start, $limit);
	/**
	 * 执行非查询SQL语句
	 * 
	 * @param string $sql
	 *        	要执行的SQL语句
	 * @return int 操作影响的行数
	 */
	public abstract function execute($sql);
	/**
	 * 最后一次生成的主键值
	 * 
	 * @return int
	 */
	public abstract function last_insert_id($name = '');
	/**
	 * 开始事务
	 * 
	 * @return boolean 事务是否开始成功
	 */
	public abstract function begin();
	/**
	 * 提交事务
	 * 
	 * @return boolean 提交是否成功
	 */
	public abstract function commit();
	/**
	 * 回滚事务
	 * 
	 * @return boolean 回滚是否成功
	 */
	public abstract function rollback();
	/**
	 * 转义字字符
	 * 
	 * @param string $str
	 *        	要转义的字符
	 * @return string 已经转义的字符
	 */
	public abstract function escape($str);
	/**
	 * 是否支持prepare SQL
	 * 
	 * @return boolean 支持返回true
	 */
	public function prepareSqlSupport() {
		return false;
	}
	/**
	 * 设置连接字符编码
	 * 
	 * @param string $encoding
	 *        	编码
	 */
	public function encoding($encoding = '') {
		$this->charset = $encoding;
	}
	/**
	 * 返回最近一次错误信息
	 * 
	 * @return string 错误信息
	 */
	public function last_error_msg($msg = '') {
		if (! empty ( $msg )) {
			$this->error_msg = $msg;
		} else {
			return $this->error_message;
		}
	}
	/**
	 * 最后一次执行的SQL语句.
	 * 
	 * @return string 数据源最后一次执行的SQL语句
	 */
	public function last_query_string() {
		return $this->queryString;
	}
	/**
	 * 记录数据库操作日志.
	 * 使用系统日志记录数据库操作日志
	 * 
	 * @param string $query        	
	 */
	public function log($query = '') {
		if (DEBUG) {
			$query = empty ( $query ) ? $this->queryString : $query;
			if (! empty ( $query )) {
				dlog ( $query );
			}
		}
	}
	/**
	 * 断开与数据库的连接
	 */
	public function discounect() {
		return true;
	}
}